/**
 * Copyright 2008 Mathias Doenitz, http://lis.to/
 *
 * This file is part of the lis.to java desktop client. The lis.to java desktop client is free software: you can
 * redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * The lis.to java desktop client is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with the lis.to java desktop client.
 * If not, see http://www.gnu.org/licenses/
 */

package listo.client;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import listo.client.actions.RadioButtonAction;

import javax.swing.*;

@Singleton
public class MenuBuilder {

    private final StatusBarManager statusBarManager;

    @Inject
    public MenuBuilder(StatusBarManager statusBarManager) {
        this.statusBarManager = statusBarManager;
    }

    public JPopupMenu createPopupMenu(Action... actions) {
        JPopupMenu menu = new JPopupMenu();
        for (Action action : actions) {
            if (action == null) {
                menu.addSeparator();
                continue;
            }
            if (action.isEnabled()) {
                menu.add(action).addMouseListener(statusBarManager);
            }
        }
        return menu;
    }

    public JMenu createMenu(String name, char mnemonic, Action... actions) {
        ButtonGroup buttonGroup = null;
        JMenu menu = new JMenu(name);
        menu.setMnemonic(mnemonic);
        for (Action action : actions) {
            if (action == null) {
                menu.addSeparator();
            } else {
                if (action instanceof RadioButtonAction) {
                    JRadioButtonMenuItem item = new JRadioButtonMenuItem(action);
                    if (buttonGroup == null) buttonGroup = new ButtonGroup();
                    buttonGroup.add(item);
                    menu.add(item);
                } else {
                    menu.add(action).addMouseListener(statusBarManager);
                }
            }
        }
        return menu;
    }

    public JMenuItem findMenuItem(MenuElement parent, Action action) {
        if (parent instanceof JMenuItem) {
            JMenuItem item = (JMenuItem) parent;
            if (item.getAction() == action) return item;
        }
        if (parent != null && parent.getSubElements() != null) {
            for (MenuElement element : parent.getSubElements()) {
                JMenuItem item = findMenuItem(element, action);
                if (item != null) return item;
            }
        }
        return null;
    }
}
